package com.线程和进程.卖票;

/*需求：某电影院目前正在上映国产大片，共有100张票，而它有3个窗口卖票，请设计一个程序模拟该电影院卖票
思路：
1.定义一个类SellTicket实现Runnable接口，里面定义一个成员变量：private int tickets=100;
2.在SellTicket类中重写run0方法实现卖票，代码步骤如下
A：判断票数大于0，就卖票，并告知是哪个窗口卖的
B：卖了票之后，总票数要减1
C：票没有了，也可能有人来问，所以这里用死循环让卖票的动作一直执行
3.定义一个测试类SellTicketDemo，里面有main方法，代码步骤如下
A：创建SellTicket类的对象
B：创建三个Thread类的对象，把SellTicket对象作为构造方法的参数，并给出对应的窗口名称
C：启动线程*/
public class SellTicket implements Runnable {
    private static int tickets = 30;
    private Object obj = new Object(); //锁，只允许一个进程执行
    static int num = 0;


    public void run() {
//        while (true) {
//            if (tickets % 2 == 0) {
//                try {
//                    //设置延迟时间，模拟买票间隔时间
//                    Thread.sleep(300);
//                } catch (InterruptedException e) {
//                    e.printStackTrace();
//                }
//                synchronized (SellTicket.class) {
//                    if (tickets > 0) {
//                        ++num;
//                        System.out.println(Thread.currentThread().getName() + "卖出第" + num + "张票");
//                        tickets--;
//                    }
//                }
//            } else {
//                sell();
//            }
//
//        }
        /*try-finally块加锁代替synchronized*/
    }

    public static synchronized void sell() {
        if (tickets > 0) {
            ++num;
            System.out.println(Thread.currentThread().getName() + "卖出第" + num + "张票");
            tickets--;
        }
    }
}
